\documentclass[a4paper,10pt]{report}
\usepackage[top=1.5cm, bottom=1.5cm, left=2cm, right=2cm]{geometry}

\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} % Use 8-bit encoding that has 256 glyphs
\usepackage{microtype} % Slightly tweak font spacing for aesthetics

\usepackage{hyperref}
\hypersetup{
  bookmarks=true,         % show bookmarks bar?
  unicode=false,          % non-Latin characters in Acrobat’s bookmarks
  pdfnewwindow=true,      % links in new window
  colorlinks=true,       % false: boxed links; true: colored links
  linkcolor=black,        % color of internal links (change box color with linkbordercolor)
  citecolor=magenta,        % color of links to bibliography
  filecolor=magenta,      % color of file links
  urlcolor=[rgb]{0,0,0.5}           % color of external links
}

\usepackage{multicol}
\usepackage{lastpage}
\usepackage{array}

\usepackage{fancyhdr} % Headers and footers
\pagestyle{fancy} % All pages have headers and footers
\fancyhead{} % Blank out the default header
\fancyfoot{} % Blank out the default footer
\fancyfoot[R]{\thepage/\pageref{LastPage}} % Custom footer text
\renewcommand{\headrulewidth}{0pt}

\setlength{\parindent}{0cm}
\usepackage{listings}
\usepackage{pdfpages}
\usepackage{graphicx}
\graphicspath{ {./img/} }

\usepackage{minted} % coloration syntaxique

\usepackage{listingsutf8}
\lstdefinestyle{ShellStyle}{
  language=bash,
  breaklines=true,
  basicstyle=\footnotesize\ttfamily\color{black},
  % numbers=left,
  % numberstyle=\small,
  % numbersep=3pt,
  frame=tb,
  % columns=fullflexible,
  backgroundcolor=\color{yellow!20},
  linewidth=0.95\linewidth,
  xleftmargin=0.05\linewidth
}

\setcounter{tocdepth}{4}
%----------------------------------------------------------------------------------------

\title{\textbf{Correction du partiel de C++ de 2009}}

\begin{document}

\maketitle{}

\thispagestyle{fancy} % All pages have headers and footers

%----------------------------------------------------------------------------------------


\section*{Analyse du programme}
\addcontentsline{toc}{section}{Analyse du programme}

Le programme est composé de 5 classes :
\begin{itemize}
\item \texttt{Personne}
\item \texttt{Personnel}
\item \texttt{Etudiant}
\item \texttt{Administratif}
\item \texttt{Enseignant}
\end{itemize}

Dans les annexes, le code source a été présenté éclaté tout comme il l'aurait dû l'être dans un projet réel.

\subsection*{Exemple de la classe \texttt{Personne}}
\addcontentsline{toc}{subsection}{Exemple de la classe \texttt{Personne}}

\subsubsection*{a) données membres : 2 variables de type \texttt{char*} (des pointeurs sur des chaines de caractères).}
\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  char* nom;
  char* adresse;
\end{minted}

\subsubsection*{b) constructeurs :}

En C++, il est possible de surcharger les constructeurs, c'est-à-dire créer des constructeurs ayant le même nom mais avec des paramètres de types différents et/ou un nombre de paramètres différents. Chaque constructeur ou fonction surchargé se différencie de son homonyme par le nombre et le type des paramètres passés et renvoyés.\\

Il existe deux constructeurs particuliers :
\begin{itemize}
\item le constructeur par défaut qui n'a aucun argument ;
\item le constructeur par copie qui a un unique argument du même type que l'objet à créer (généralement sous forme de référence constante $\rightarrow$ \texttt{const Type\_Objet \&}) et qui recopie les attributs de l'objet passé en argument dans l'objet à créer.
\end{itemize}

\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  Personne(void); // constructeur par defaut
  
  Personne(const char* var_name, const char* var_adress=0); // constructeur normal
  /* prend en parametre 2 chaines de caracteres, mais la deuxieme est facultative.
   * =0 peut aussi s'ecrire =NULL. Ceci signifie que on peut ne pas donner de 2eme
   * argument a la fonction.
   */
  
  Personne(const Personne &Pers); // constructeur par copie
\end{minted}

\subsubsection*{c) fonctions membres = fonctions accessibles au travers d'un objet}

\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  const char* getNom(void) const;
\end{minted}
\texttt{getNom} ne prend rien en argument (type \texttt{void}) et retourne une chaine de caractères (type \texttt{char*}). Le mot-clé \texttt{const} associé au \texttt{char*} signifie que cette chaine de caractères ne pourra être modifiée à l'extérieur de l'objet. Le \texttt{const} après la fonction signifie que la fonction n'apportera aucune modification à l'objet, autrement dit l'état de l'objet avant et après l'exécution de cette fonction sera le même.\\
Ce type de fonction est appelé un \textit{getter}, il permet d'accéder aux données membres depuis l'extérieur de l'objet.\\

\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  void setNom(const char* name);
\end{minted}
\texttt{setNom} ne retourne rien (type \texttt{void}) et prend en argument une chaine de caractères (type \texttt{char*}). Le mot-clé \texttt{const} signifie dans ce contexte que le pointeur passé en paramètre ne subira aucune modification durant son traitement dans la fonction. En d'autres mots, la chaine de caractères est en lecture seule et ne subira aucune modification.\\
Ce type de fonction est appelé un \textit{setter}, il permet de modifier une/des donnée(s) membre(s) depuis l'extérieur de l'objet une fois que l'objet a été créé.\\

\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  const char* getAdresse(void) const;
\end{minted}
Pareille que \texttt{getNom}, pas la peine de s'y attarder.\\

\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  void setAdresse(const char* adress);
\end{minted}
Pareille que \texttt{setNom}, pas la peine de s'y attarder.\\

\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  virtual void printInfo(void);
\end{minted}
\texttt{printInfo} est une fonction d'affichage qui ne prend pas de paramètre et ne retourne rien. Cependant, on peut noter la présence du mot \texttt{virtual}. Ce mot-clé signifie qu'il s'agit d'une fonction \textbf{virtuelle} (ou \textbf{abstraite}).\\
Une fonction abstraite est destinée à être redéfinie dans les classes qui en héritent (les classes filles). La fonction \texttt{printInfo} est de nouveau redéfinie dans toutes les autres classes et possède à chaque fois le même prototype mais peut donc avoir un comportement différent puisque le code ne sera pas forcément le même. On peut se rendre compte par exemple que le corps de la fonction n'est pas le même dans la classe \texttt{Personne} et \texttt{Personnel}.\\

\textbf{ATTENTION: Ne pas confondre la redéfinition (\textit{overriding}) avec la surcharge (\textit{overloading}) comme pour les constructeurs !}

\subsection*{Les autres classes}
\addcontentsline{toc}{subsection}{Les autres classes}

C'est exactement la même démarche, rien de nouveau.\\
On pourra noter là aussi que la fonction \texttt{calculerSalaire} est virtuelle.\\
Voici son prototype dans la classe \texttt{Personnel} :
\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  virtual double calculerSalaire(void) const;
\end{minted}
Et voici son prototype dans les classes filles \texttt{Enseignant} et \texttt{Administratif} :
\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
  double calculerSalaire(void) const;
\end{minted}

On peut noter l'absence du mot-clé \texttt{virtual} dans la deuxième déclaration. Son absence n'est pas un oubli mais plutôt un sous-entendu. Les classes \texttt{Enseignant} et \texttt{Administratif} sont des classes filles de la classe \texttt{Personnel} donc par héritage, cette fonction est aussi \texttt{virtual} mais il est facultatif de le spécifier.

\section*{Hiérarchie et Analyse des dépendances}
\addcontentsline{toc}{section}{Hiérarchie et Analyse des dépendances}

\subsection*{Diagramme d'héritage}
\addcontentsline{toc}{subsection}{Diagramme d'héritage}

Voir la fig.\ref{fig:diagramme-de-classes} en annexe.

\subsection*{Polymorphisme}
\addcontentsline{toc}{subsection}{Polymorphisme}

Aucune des fonctions n'est surchargée, seulement les contructeurs. Étant donné que la question cible les fonctions, j'ai choisi arbitrairement de ne pas les faire figurer dans le tableau.\\

\begin{tabular}{|l|c|c|c|c|c|}
  \hline
   & \texttt{Personne} & \texttt{Personnel} & \texttt{Etudiant} & \texttt{Enseignant} & \texttt{Administratif} \\
  \hline
  \texttt{getNom} & D & U & U & U & U \\
  \hline
  \texttt{setNom} & D & U & U & U & U \\
  \hline
  \texttt{getAdresse} & D & U & U & U & U \\
  \hline
  \texttt{setAdresse} & D & U & U & U & U \\
  \hline
  \texttt{printInfo} & D & R & R & R & R \\
  \hline
  \texttt{getSalaireMensuel} & I & D & I & U & U \\
  \hline
  \texttt{setSalaireMensuel} & I & D & I & U & U \\
  \hline
  \texttt{getNumeroBureau} & I & D & I & U & U \\
  \hline
  \texttt{setNumeroBureau} & I & D & I & U & U \\
  \hline
  \texttt{calculerSalaire} & I & D & I & R & R \\
  \hline
  \texttt{getMoyenne} & I & I & D & I & I \\
  \hline
  \texttt{setMoyenne} & I & I & D & I & I \\
  \hline
\end{tabular}

\pagebreak

\section*{Question difficile}
\addcontentsline{toc}{section}{Question difficile}

La question ci-dessous traite des changements par le retrait du mot-clé \texttt{virtual} à la ligne 20 du fichier \texttt{Personne.hpp}. Nous allons détailler à la fois l'affichage de la version avec \texttt{virtual} et celle sans \texttt{virtual}.

\subsection*{Les constructeurs}
\addcontentsline{toc}{subsection}{Les constructeurs}

Cette partie est commune aux deux versions.\\

Création de ``Jean'' qui est de type \texttt{Personne}, 1 seul constructeur est appelé.
\begin{lstlisting}[style=ShellStyle]
  constructeur 2 de la classe Personne pour la personne [Jean]

\end{lstlisting}

Création de ``Robert'' qui est de type \texttt{Personnel}, 2 constructeurs sont appelés, celui de \texttt{Personne} puis celui de \texttt{Personnel}.
\begin{lstlisting}[style=ShellStyle]
  constructeur 2 de la classe Personne pour la personne [Robert]
  constructeur 2 de la classe Personnel pour la personne [Robert]

\end{lstlisting}

Création de ``Claude'' qui est de type \texttt{Etudiant}, 2 constructeurs sont appelés, celui de \texttt{Personne} puis celui de \texttt{Etudiant}.
\begin{lstlisting}[style=ShellStyle]
  constructeur 2 de la classe Personne pour la personne [Claude]
  Appel du constructeur 2 pour l'etudiant [Claude]

\end{lstlisting}

Création de ``Gérard'' qui est de type \texttt{Administratif}, 3 constructeurs sont appelés, celui de \texttt{Personne} puis celui de \texttt{Personnel} et enfin, celui d'\texttt{Administratif}.
\begin{lstlisting}[style=ShellStyle]
  constructeur 2 de la classe Personne pour la personne [Gerard]
  constructeur 2 de la classe Personnel pour la personne [Gerard]
  constructeur 2 de la classe Administratif pour la personne [Gerard]

\end{lstlisting}

Création de ``Guillaume'' qui est de type \texttt{Enseignant}, 3 constructeurs sont appelés, celui de \texttt{Personne} puis celui de \texttt{Personnel} et enfin, celui d'\texttt{Enseignant}.
\begin{lstlisting}[style=ShellStyle]
  constructeur 2 de la classe Personne pour la personne [Guillaume]
  constructeur 2 de la classe Personnel pour la personne [Guillaume]
  constructeur 2 de la classe Enseignant pour la personne [Guillaume]

\end{lstlisting}

\subsection*{Les différences dans le programme}
\addcontentsline{toc}{subsection}{Les différences dans le programme}

\setlength{\columnseprule}{0.5mm}
\setlength{\columnsep}{8mm}
\begin{multicols}{2}
\centering
Avec \texttt{virtual}
\begin{lstlisting}[style=ShellStyle]
  Personnel : 
  Nom : Robert
  Adresse non definie: 
  Bureau : 0
  Salaire : 0

  Personnel administratif : 
  Nom : Gerard
  Adresse non definie: 
  Bureau : 1
  Salaire : 0

  Personnel enseignant : 
  Nom : Guillaume
  Adresse non definie: 
  Bureau : 2
  Salaire : 0
\end{lstlisting}

Sans \texttt{virtual}
\begin{lstlisting}[style=ShellStyle]
  Personnel : 
  Nom : Robert
  Adresse non definie: 
  Bureau : 0
  Salaire : 0

  Personnel : 
  Nom : Gerard
  Adresse non definie: 
  Bureau : 1
  Salaire : 2400

  Personnel : 
  Nom : Guillaume
  Adresse non definie: 
  Bureau : 2
  Salaire : 2800

\end{lstlisting}

\end{multicols}

\subsection*{Les destructeurs}
\addcontentsline{toc}{subsection}{Les destructeurs}

Et enfin, pour terminer, les appels des destructeurs qui sont identiques pour les deux versions.
\begin{lstlisting}[style=ShellStyle]
  # Destructeur de Guillaume (3 appels : Enseignant => Personnel => Personne)
  Destructeur de la classe Enseignant 
  destructeur de la classe Personnel pour la personne [Guillaume]
  destructeur de la classe Personne pour la personne |Guillaume|

  # Destructeur de Gerard (3 appels : Administratif => Personnel => Personne)
  Destructeur de la classe Administratif 
  destructeur de la classe Personnel pour la personne [Gerard]
  destructeur de la classe Personne pour la personne |Gerard|

  # Destructeur de Claude (2 appels : Etudiant => Personne)
  Appel du destructeur de la classe Etudiant
  destructeur de la classe Personne pour la personne |Claude|

  # Destructeur de Robert (2 appels : Personnel => Personne)
  destructeur de la classe Personnel pour la personne [Robert]
  destructeur de la classe Personne pour la personne |Robert|

  # Destructeur de Jean (1 appel : Personne)
  destructeur de la classe Personne pour la personne |Jean|

\end{lstlisting}

\appendix

\chapter*{Appendix}
\section*{Diagramme de classes}
\addcontentsline{toc}{section}{Diagramme de classes}
\begin{figure}[H]
  \centering
  \includegraphics[scale=0.85, angle=90]{diagramme-de-classes.pdf}
  \label{fig:diagramme-de-classes}
\end{figure}

\section*{Code source}
\addcontentsline{toc}{section}{Code source}

\subsection*{main.cpp}
\addcontentsline{toc}{subsection}{main.cpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/main.cpp}

\subsection*{Classe \texttt{Personne}}
\addcontentsline{toc}{subsection}{Classe \texttt{Personne}}

\subsubsection*{Personne.hpp}
\addcontentsline{toc}{subsubsection}{Personne.hpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Personne.hpp}

\pagebreak

\subsubsection*{Personne.cpp}
\addcontentsline{toc}{subsubsection}{Personne.cpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Personne.cpp}

\pagebreak

\subsection*{Classe \texttt{Personnel}}
\addcontentsline{toc}{subsection}{Classe \texttt{Personnel}}

\subsubsection*{Personnel.hpp}
\addcontentsline{toc}{subsubsection}{Personnel.hpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Personnel.hpp}

\subsubsection*{Personnel.cpp}
\addcontentsline{toc}{subsubsection}{Personnel.cpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Personnel.cpp}

\pagebreak

\subsection*{Classe \texttt{Etudiant}}
\addcontentsline{toc}{subsection}{Classe \texttt{Etudiant}}

\subsubsection*{Etudiant.hpp}
\addcontentsline{toc}{subsubsection}{Etudiant.hpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Etudiant.hpp}

\subsubsection*{Etudiant.cpp}
\addcontentsline{toc}{subsubsection}{Etudiant.cpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Etudiant.cpp}

\pagebreak

\subsection*{Classe \texttt{Enseignant}}
\addcontentsline{toc}{subsection}{Classe \texttt{Enseignant}}

\subsubsection*{Enseignant.hpp}
\addcontentsline{toc}{subsubsection}{Enseignant.hpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Enseignant.hpp}

\subsubsection*{Enseignant.cpp}
\addcontentsline{toc}{subsubsection}{Enseignant.cpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Enseignant.cpp}

\pagebreak

\subsection*{Classe \texttt{Administratif}}
\addcontentsline{toc}{subsection}{Classe \texttt{Administratif}}

\subsubsection*{Administratif.hpp}
\addcontentsline{toc}{subsubsection}{Administratif.hpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Administratif.hpp}

\subsubsection*{Administratif.cpp}
\addcontentsline{toc}{subsubsection}{Administratif.cpp}
\inputminted[linenos=true,frame=single,fontsize=\scriptsize]{c++}{../src/Administratif.cpp}

\end{document}
